package com.atguigu.study.config;

import com.atguigu.study.service.ChatAssistant;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author Marco
 * @Description
 * @date 2025/8/22 23:17
 * @email 3293336923@qq.com
 */
@Configuration
public class LLMConfig {

    @Bean
    public ChatModel chatModel() {
        return
                OpenAiChatModel.builder()
                        .apiKey(System.getenv("ALIQW"))
                        .modelName("qwen-plus")
                        .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")
                        .build();
    }




//      基于 内存型的 向量数据库， 维度 384 和 1024 都可以
    @Bean
    public InMemoryEmbeddingStore<TextSegment> embeddingStore() {
        return new InMemoryEmbeddingStore<>();
    }





//   Qdrant 的 向量数据库 ， 当前 维度 保持在 384 才可以 ， 要配置的 维度 和 模型 有关系

//    @Bean
//    public EmbeddingStore<TextSegment> embeddingStore() {
//        return QdrantEmbeddingStore.builder()
//                .host("192.168.100.22")
//                .port(6334)
//                .collectionName("test-qdrant02")
//                .build();
//    }

    @Bean
    public ChatAssistant chatAssistant(ChatModel chatModel, EmbeddingStore<TextSegment> embeddingStore) {

        return
                AiServices.builder(ChatAssistant.class)
                        .chatModel(chatModel)
                //       记忆缓存
                        .chatMemory(MessageWindowChatMemory.withMaxMessages(50))
                //      引进 rag 的 外部数据源 的向量数据库
                        .contentRetriever(EmbeddingStoreContentRetriever.from(embeddingStore))
                        .build();


    }
}
